/*
 * CommonAdapter.java
 * business
 *
 * Created by SunDing on 2016/9/9.
 *
 * Copyright (c) 2016年 yidiandao. All rights reserved.
 */

package com.yidiandao.business.ui.widget.listview;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import com.yidiandao.business.ui.widget.recyclerview.MultiTypeLoadMoreAdapter;
import com.yidiandao.business.utils.LogUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * ListView-Adapter基类
 *
 * @deprecated use {@link  me.drakeet.multitype.MultiTypeAdapter } or
 * {@link MultiTypeLoadMoreAdapter} instead
 */
@Deprecated
public abstract class CommonAdapter<T extends DisplayListItem> extends BaseAdapter {

    /**
     * 存储当前Adapter中的所有的DisplayListItem的集合
     */
    protected List<T> mData;

    private Context mContext;

    private int position;

    public CommonAdapter(Context context) {
        mContext = context;
        mData = new ArrayList<>();

        // 注册当前Adapter所包含的所有的DisplayListItem
        // 注册完成后就可以通过getViewTypeCount(),getItemViewType()获取到与type相关的信息
        registerDisplayListItemMap();
    }

    public List<T> getData() {
        return mData;
    }

    /**
     * 设置Adapter需要显示的数据
     * <p>
     * <p>
     * <p><b>注意：必须调用该方法</b>
     *
     * @param data DisplayListItem的集合
     */
    public void setData(List<T> data) {
        mData = data;
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return mData == null ? 0 : mData.size();
    }

    @Override
    public T getItem(int position) {
        return mData == null ? null : mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        this.position = position;
        // 获取当前position对应的对象，也就是DisplayListItem(管理每个Item的 UI 与 数据 )
        T item = getItem(position);
        ViewHolder viewHolder;
        try {
            if (convertView == null) {
                // 创建Item对应的ViewHolder

                // 数据对应的是List<DisplayListItem>的集合，里面包含了不同的DisplayListItem
                // 即：服务器的数据返回之后并设置到Adapter中后，在此处就会根据不同的DisplayListItem去加载不同的布局
                // getViewTypeCount 与 getItemViewType 与该集合中的数据对应,已在DisplayItemManager中完成了封装
                // 相应的DisplayListItem 就会自动返回对应的 itemType
                // 即：不需要再在getView中进行相应position的type的判断
                viewHolder = (ViewHolder) item.getViewHolderClazz().newInstance();

                if (viewHolder != null) {
                    // 针对不同的DisplayListItem加载不同的布局文件
                    convertView = viewHolder.inflate(mContext, parent);
                }

                // setTag  convertView的复用与itemType有关
                convertView.setTag(viewHolder);
            } else {
                // getTag
                viewHolder = (ViewHolder) convertView.getTag();
            }

            // 为当前的ViewHolder绑定数据
            bindView(viewHolder, item);
        } catch (Exception e) {
            LogUtils.e(e);
        }
        return convertView;
    }

    private void bindView(ViewHolder viewHolder, T item) {
        item.onShow(mContext, viewHolder);
    }

    @Override
    public int getItemViewType(int position) {
        // 返回当前position的Item的type
        DisplayListItem displayListItem = getItem(position);
        return DisplayItemManager.getItemViewType(displayListItem.getClass(), getAdapterTag());
    }

    @Override
    public int getViewTypeCount() {
        // 返回ItemType数量
        return DisplayItemManager.getViewTypeCount(getAdapterTag());
    }

    /**
     * @return 返回当前holder所在的position
     */
    public int getPosition() {
        return position;
    }

    /**
     * 注册当前Adapter所包含的所有的DisplayListItem，注册完成后就可以获取到与type相关的信息
     */
    protected abstract void registerDisplayListItemMap();

    /**
     * 返回当前Adapter的唯一标识
     */
    protected abstract String getAdapterTag();
}
